package br.here.dominio;

import java.util.Collection;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import br.here.data.Persistence;

@Entity
@Table(name="usuario")
public class Usuario implements Persistence {
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_usuario")
	private int id;

	@Column
	private String nome;
	
	@Column(nullable=false)
	private String senha;
	
	@Column(nullable=false, unique=true)
	private String email;
	
	@OneToOne
	@JoinColumn(name="id_local")
	private Local localAtual;
	
	@OneToMany(mappedBy="usuarioFrom", fetch=FetchType.EAGER)
	@Cascade(CascadeType.ALL)
	private List<Amigo> amigos;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="usuario_local",
		joinColumns=@JoinColumn(name="id_usuario"),
		inverseJoinColumns=@JoinColumn(name="id_local"))
	private List<Local> locais;

	@OneToMany(mappedBy="usuario", fetch=FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private List<Arquivo> arquivos;
	/** 
	private List<Postagem> postagens;
 	*/
	
	/**
	 * Auxiliar utilizado na busca de usuarios (buscar amigo)
	 */
	@Transient
	private Collection<Usuario> resultadoBusca;
	
	public Usuario() {
		this.nome = new String();
		this.senha = new String();
		this.email = new String();
		/**
		this.amigos = new ArrayList<Usuario>();
		this.locais = new ArrayList<Local>();
		this.postagens = new ArrayList<Postagem>();
		this.arquivos = new ArrayList<Arquivo>();
		*/
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Local getLocalAtual() {
		return localAtual;
	}

	public void setLocalAtual(Local localAtual) {
		this.localAtual = localAtual;
	}

	public List<Amigo> getAmigos() {
		return amigos;
	}

	public void setAmigos(List<Amigo> amigos) {
		this.amigos = amigos;
	}

	public List<Local> getLocais() {
		return locais;
	}

	public void setLocais(List<Local> locais) {
		this.locais = locais;
	}

	public List<Arquivo> getArquivos() {
		return arquivos;
	}

	public void setArquivos(List<Arquivo> arquivos) {
		this.arquivos = arquivos;
	}

	public void setResultadoBusca(Collection<Usuario> resultadoBusca) {
		this.resultadoBusca = resultadoBusca;
	}

	public Collection<Usuario> getResultadoBusca() {
		return resultadoBusca;
	}

	

}
